// 翻转一棵二叉树。

function invertTree(root: TreeNode | null): TreeNode | null {
    // 递归出口-->安全校验
    if(root === null){
        return null;
    }
    // 如果遇到叶节点，那么直接返回叶节点
    if(root.left == null && root.right == null){
        return root
    }
    // 使用解构赋值来交换左右子树
    [root.left,root.right] = [invertTree(root.right),invertTree(root.left)];
    return root;
};


// 这道题目是一道蛮好的递归设计题目，会写的话非常简单，不会写的话就会比较绕
// 首先先要从递归的出口开始思考，我们采用深度优先遍历的方式
// 1.如果遍历到当前的节点为空，直接返回一个null就可以了
// 2.如果遍历到一个叶子节点，即左右子树为空，那么直接返回这个叶节点
// 剩下的事情只需要交给递归，我们递归的方式来交换左右子树
// 这里有一个值得注意的问题：
// 交换左右子树的过程中其实跟交换值是类似的，会存在先后覆盖
// 所以这里要不然需要临时变量temp存储，要不然需要解构赋值来进行交换
// 左右子树交换完直接返回根节点即可